/*
 */

package Dblayer;

import Modellayer.*;
import java.sql.*;
import java.util.ArrayList;
/**
 *
 * @author Michael
 */
public class DBBruger implements IFDBBruger
{

	private Connection con;

	public DBBruger()
	{
            con = DBConnection.getInstance().getDBcon();
	}

	public ArrayList<Bruger> hentBruger(boolean retrieveAssociation)
    {
        return miscWhere("", retrieveAssociation);
    }

	public Bruger findBruger(int ID, boolean retrieveAssociation)
    {
        String wClause = "  BrugerID = '" + ID + "'";
        return singleWhere(wClause, retrieveAssociation);
    }
	
	public Bruger login(String brugernavn)
	{
		String wClause = " brugernavn = '" + brugernavn +"'";
		return singleWhere(wClause, false);
	}

	public Bruger soegBrugernavn(String name, boolean retrieveAssociation)
    {
        String wClause = "name like '%" + name + "%'";
        return singleWhere(wClause, retrieveAssociation);
    }

	public int opretBruger(Bruger bruger)
	{
	int rc = -1;
    String query="INSERT INTO semBruger(brugerID, brugernavn, kodeord, medNr, stilling)  VALUES('"+
	  		bruger.getBrugerID()  + "','"  +
			bruger.getBrugerNavn() + "','" +
			bruger.getKode() + "','" +
			bruger.getMedNr().getMedNr() + "','" +
			bruger.isStilling() + "')";

      System.out.println("insert : " + query);
      try{ //indsæt ny bruger
            Statement stmt = con.createStatement();
	 	  	stmt.setQueryTimeout(5);
	 	  	rc = stmt.executeUpdate(query);
	 	  	stmt.close();
		}//slut try
	 	catch(Exception ex){
	 	  	System.out.println("Insert exception in semBruger db: "+ex);
	   }
	   return(rc);
	}

	public void sletBruger(int id)
	{
               int rc=-1;

	  	String query="DELETE FROM semBruger WHERE brugerID = '" +
				id + "'";
                System.out.println(query);
	  	try{ //slet fra semBruger
	 		Statement stmt = con.createStatement();
	 		stmt.setQueryTimeout(5);
	 	  	rc = stmt.executeUpdate(query);
	 	  	stmt.close();
  		}//slut try
   	        catch(Exception ex){
	 	  	System.out.println("Delete exception in semBruger db: "+ex);
   	        }
	}

	public int redigerBruger(Bruger bruger)
	{
		Bruger brugerObj  = bruger;
		int rc=-1;

		String query="UPDATE semBruger SET "+
                        "brugernavn ='" + brugerObj.getBrugerNavn() + "', " +
		    	"brugerID ='" + brugerObj.getBrugerID() + "', " +
                        "kosdeord ='" + brugerObj.getKode() + "', " +
                        "stilling ='" + brugerObj.isStilling() + "' " +
		        " WHERE brugerID = '"+ brugerObj.getBrugerID() + "'";

                System.out.println("Update query:" + query);
  		try{ //opdater bruger
	 		Statement stmt = con.createStatement();
	 		stmt.setQueryTimeout(5);
	 	 	rc = stmt.executeUpdate(query);

	 	 	stmt.close();
		}//slut try
	 	catch(Exception ex){
	 	 	System.out.println("Update exception in bruger db: "+ex);
	  	}
		return(rc);
    }

	private ArrayList<Bruger> miscWhere(String wClause, boolean retrieveAssociation)
	{
            ResultSet results;
	    ArrayList<Bruger> list = new ArrayList<Bruger>();

	    String query =  buildQuery(wClause);

            try{ //læs semBestilling fra databasen
		Statement stmt = con.createStatement();
	 	stmt.setQueryTimeout(5);
	 	results = stmt.executeQuery(query);

		int snr=0;
		while( results.next() ){
	     	 Bruger brugerObj = new Bruger();
		 brugerObj = buildBruger(results);
                 list.add(brugerObj);
		}//end while
                 stmt.close();
                 if(retrieveAssociation)
                 {   //medarbejderen bliver bygget
                     for(Bruger brugerObj : list){
						IFDBMedarbejder dbMedarbejderObj = new DBMedarbejder();
                        Medarbejder medarbejderObj = dbMedarbejderObj.findMedarbejder(brugerObj.getMedNr().getMedNr());
                        System.out.println("medarbejder is seleceted ");
						brugerObj.setMedNr(medarbejderObj);
                     }
                 }//slut if

		}//slut try
	 	catch(Exception e){
	 		System.out.println("Query exception - select: "+e);
			e.printStackTrace();
	 	}
		return list;
	}

	//Singelwhere bliver kun brugt hvis der kun er 1 bruger
	private Bruger singleWhere(String wClause, boolean retrieveAssociation)
	{
		ResultSet results;
		Bruger brugerObj = new Bruger();

	        String query =  buildQuery(wClause);
                System.out.println(query);
		try{ //læs semBruger fra databasen
	 		Statement stmt = con.createStatement();
	 		stmt.setQueryTimeout(5);
	 		results = stmt.executeQuery(query);

	 		if( results.next() ){
                            brugerObj = buildBruger(results);
                            //assocaition bliver bygget
                            stmt.close();
                            if(retrieveAssociation)
                            { 
						IFDBMedarbejder dbMedarbejderObj = new DBMedarbejder();
                        Medarbejder medarbejderObj = dbMedarbejderObj.findMedarbejder(brugerObj.getMedNr().getMedNr());
                        System.out.println("medarbejder is seleceted ");
						brugerObj.setMedNr(medarbejderObj);
                            }
			}
                        else{ //ingen bruger blev fundet
                            brugerObj = null;
                        }
		}//slut try
	 	catch(Exception e){
	 		System.out.println("Query exception: "+e);
	 	}
		return brugerObj;
	}
	//metoden der bygger en "query"
	private String buildQuery(String wClause)
	{
	    String query="SELECT brugerID, brugernavn, kodeord, medNr, stilling FROM semBruger";

		if (wClause.length()>0)
			query=query+" WHERE "+ wClause;

		return query;
	}

	private Bruger buildBruger(ResultSet results)
      {   Bruger brugerObj = new Bruger();
          Medarbejder medObj = new Medarbejder();
          try{//de tables der bliver brugt er fra semBruger
                brugerObj.setBrugerID(results.getInt("brugerID"));
                brugerObj.setBrugerNavn(results.getString("brugernavn"));
                brugerObj.setKode(results.getString("kodeord"));
                brugerObj.setStilling((results.getBoolean("stilling")));
                medObj.setMedNr(results.getInt("medNr"));
                brugerObj.setMedNr(medObj);
          }
         catch(Exception e)
         {
             System.out.println("error in building the Bruger object");
         }
         return brugerObj;
      }
}
